package com.sp.ThreadUse;

/**
 * 线程应用案例1 - 继承Thread类
 * 1. 请编写程序, 开启一个线程, 该线程每隔1秒, 在控制台输出"喵喵, 我是小猫咪"
 * 2. 对上题改进: 当输出80次 "喵喵, 我是小猫咪", 结束该进程
 * 3. 使用JConsole监控线程执行情况, 并画出程序示意图
 */
public class Thread01 {
    public static void main(String[] args) throws InterruptedException {
        Cat cat = new Cat();
        cat.start();//启动线程 -> 最终会执行cat的run方法
        /* 源码解读: 调用start方法, start方法再调用start0方法
            (1)
            public synchronized void start() {
                start0();
            }
            (2)
            //start0() 是本地方法，是JVM调用, 底层是c/c++实现
            //真正实现多线程的效果， 是start0(), 而不是 run
            private native void start0();

         */
        //当main线程启动一个子线程Thread-0, 主线程不会阻塞, 会继续执行
        System.out.println("主线程继续执行" + Thread.currentThread().getName());//名字main
        for (int i = 0; i < 60; i++) {
            System.out.println("主线程 i= " + i);
            Thread.sleep(1000);
        }
    }
}

/**
 * 1. 当一个类继承了 Thread 类, 该类就可以当作线程使用
 * 2. 重写run方法, 写上自己的方法
 */
class Cat extends Thread {
    int times = 0;
    @Override
    public void run() {//重写run方法, 写上自己的业务逻辑
        while(true) {
            System.out.println("喵喵, 我是小猫咪" + (++times) + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (times == 80) {
                break;
            }
        }
    }
}